package com.city.service.pub.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;


/*
 * @Author 何平
 * @Description //TODO RedisService 定义Redis服务
 * @Date 14:31 2018/8/3
 **/

@Service
public abstract class RedisService<T> {

    //实例化RedisTemplate对象
    @Autowired
    protected RedisTemplate<String,Object> redisTemplate;

    //定义hash结构 操作存储实体对象
    @Resource
    protected HashOperations<String,String,T> hashOperations;

    //定义Hash表的redis key的名称
    protected abstract String getRedisKey();

    /*
     * @Author 何平
     * @Description //TODO put 在相应Hash表中添加键值对 key:Object(domain)
     * @Date 13:59 2018/8/3
     * @Param [key, domain, expire（过期时间，传入-1时表示不设置过期时间）]
     * @return void
     **/
    public void put(String key,T domain,long expire){
        hashOperations.put(getRedisKey(),key,domain);
        if(expire != -1){
            redisTemplate.expire(getRedisKey(),expire, TimeUnit.SECONDS);
        }
    }
        
    /**
     * @Author 何平
     * @Description //TODO remove 在Hash表中删除key名称的元素
     * @Date 14:00 2018/8/3
     * @Param [key]
     * @return void
     **/
    public void remove(String key) {
        hashOperations.delete(getRedisKey(), key);
    }

    /**
     * @Author 何平
     * @Description //TODO get 查询Hash表中key名称的元素
     * @Date 14:01 2018/8/3
     * @Param [key]
     * @return T
     **/
    public T get(String key) {
        return hashOperations.get(getRedisKey(), key);
    }

    /**
     * @Author 何平
     * @Description //TODO getAll 获取Hash表中的所有实体对象
     * @Date 14:02 2018/8/3
     * @Param []
     * @return java.util.List<T>
     **/
    public List<T> findAll() {
        return hashOperations.values(getRedisKey());
    }

    /**
     * @Author 何平
     * @Description //TODO isKeyExists 判断在Hash表中是否存在key
     * @Date 14:03 2018/8/3
     * @Param [key]
     * @return boolean
     **/
    public boolean isKeyExists(String key) {
        return hashOperations.hasKey(getRedisKey(), key);
    }

    /**
     * @Author 何平
     * @Description //TODO count 查询Hash表中的缓存数量
     * @Date 14:03 2018/8/3
     * @Param []
     * @return long
     **/
    public long count() {
        return hashOperations.size(getRedisKey());
    }

    /*
     * @Author 何平
     * @Description //TODO empty 清除Hash表中的所有缓存
     * @Date 14:04 2018/8/3
     * @Param []
     * @return void
     **/
    public void empty() {
        Set<String> set = hashOperations.keys(getRedisKey());
        set.stream().forEach(key -> hashOperations.delete(getRedisKey(), key));
    }

}
